﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;

namespace ServerCShar
{
    class Veiculo
    {
        /// <summary>
        /// ID do veículo
        /// </summary>
        private Int16 id;

        /// <summary>
        /// Ultima posição conhecida do veículo. Em conjunto com o atributo estado, é possível afirmar se o veículo ainda se encontra nesta posição.
        /// </summary>
        private Int16 ultPosicao;

        /// <summary>
        /// Atributo responsável pela associação do veículo a um cliente da conexão via socket.
        /// </summary>
        private TcpClient clientHandler;

        /// <summary>
        /// Estado do veículo.
        /// </summary>
        private Status estado;
    
        public enum Status
        {
            INVALIDO = -1,
            INDISPONIVEL = 0,
            DISPONIVEL = 1,
            EM_TRANSITO = 2,
        }

        public Veiculo()
        {
            ID = 0;
            UltPosicao = 0;
            Estado = Status.DISPONIVEL;
            clientHandler = null;
        }

        public Veiculo(TcpClient client)
        {
            ID = 0;
            UltPosicao = 0;
            Estado = Status.DISPONIVEL;
            ClientHandler = client;
        }

        public Veiculo(Int16 id, Int16 ultPosicao, TcpClient client)
        {
            this.ID = id;
            this.UltPosicao = ultPosicao;
            this.Estado = Status.DISPONIVEL;
            ClientHandler = client;
        }

        public Veiculo(Int16 id, Int16 ultPosicao, Status estado,TcpClient client)
        {
            this.ID = id;
            this.UltPosicao = ultPosicao;
            this.Estado = estado;
            ClientHandler = client;
        }

        public Veiculo(Int16 id, Int16 ultPosicao, Byte estado, TcpClient client)
        {
            this.ID = id;
            this.UltPosicao = ultPosicao;
            this.Estado = (Status)estado;
            ClientHandler = client;
        }

        public Int16 ID
        {
            get
            {
                return id;
            }
            set
            {
                id = (value < 0) ? (Int16)0 : value;           
            }
        }

        public Int16 UltPosicao
        {
            get
            {
                return ultPosicao;
            }
            set
            {
                ultPosicao = (value < 0) ? (Int16)0 : value;
            }
        }

        public TcpClient ClientHandler
        {
            get
            {
                return clientHandler;
            }
            set
            {
                clientHandler = value;
            }
        }

        public Status Estado
        {
            get
            {
                return estado;
            }
            set
            {
                if ((Byte)value >= 0 && (Byte)value <= 2) estado = value;
                else estado = Status.INVALIDO;
            }
        }

        public static Status StringToStatus(String s)
        {
            if (s.Equals("#EM_TRANSITO#"))
            {
                return Status.EM_TRANSITO;
            }
            if (s.Equals("#DISPONIVEL#"))
            {
                return Status.DISPONIVEL;
            }
            if (s.Equals("#INDISPONIVEL#"))
            {
                return Status.INDISPONIVEL;
            }
            return Status.INVALIDO;
        }
        
    }
}
